package org.cxy.sort;

import java.util.Arrays;

//冒泡排序
public class BubbleSortDemo {
    public static void main(String[] args) {
        int[] arr = {7, 8, 6, 3, 4, 9, 5};
        
        System.out.println("原始数组: " + Arrays.toString(arr));
        
        // 调用冒泡排序方法
        int[] sortedArr = bubbleSort(arr);
        
        System.out.println("排序后数组: " + Arrays.toString(sortedArr));
    }

    /**
     * 冒泡排序：对整型数组进行升序排序
     * 原理：重复遍历数组，比较相邻元素，大的往后“冒泡”
     *
     * @param arr 待排序的数组（会原地修改）
     * @return 已排序的数组（与输入为同一对象）
     */
    public static int[] bubbleSort(int[] arr) {
        // 外层循环：控制排序轮数
        // 总共需要 arr.length - 1 轮比较
        // 因为每一轮都会将当前最大值“冒泡”到正确位置
        for (int i = 0; i < arr.length - 1; i++) {
            System.out.println("第 " + (i + 1) + " 轮排序后: ");

            // 内层循环：每一轮中，两两比较并交换
            // 每完成一轮，末尾的 i+1 个元素已有序，无需再比较
            // 所以内层循环条件为 j < arr.length - 1 - i
            for (int j = 0; j < arr.length - 1 - i; j++) {
                // 比较相邻两个元素
                if (arr[j] > arr[j + 1]) {
                    // 如果前一个比后一个大，则交换（升序）
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }

            // 打印每一轮排序后的结果，便于观察算法过程
            System.out.println(Arrays.toString(arr));
        }
        return arr;
    }
}